#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+100;
struct tree{
    int l, r;
    ll sum;
    int tag;
}T[maxn*4];

void build(int i, int l, int r){
    T[i] = {l, r, 0, 0};
    if(l == r){
        int in; cin >> in;
        T[i].sum = in;
        return;
    }
    int mid = (l + r) >>1;
    build(i*2, l, mid);
    build(i*2+1, mid+1, r);
    T[i].sum = T[i*2].sum + T[i*2+1].sum;
}

void pushdown(int i){
    if(T[i].tag){
        T[i*2].tag += T[i].tag;
        T[i*2+1].tag += T[i].tag;

        T[i*2].sum += T[i].tag * (T[i*2].r - T[i*2].l + 1);
        T[i*2+1].sum += T[i].tag * (T[i*2+1].r - T[i*2+1].l + 1);
        T[i].tag = 0;
    }
}

void add(int i, int l, int r, int a){
    if(l <= T[i].l && T[i].r <= r){
        T[i].sum += a*(T[i].r-T[i].l+1);
        T[i].tag += a;
        return ;
    }
    pushdown(i);
    if(l <= T[i*2].r)  add(i*2, l, r, a);
    if(r >= T[i*2+1].l) add(i*2+1, l, r, a);
    T[i].sum = T[i*2].sum + T[i*2+1].sum;
}



ll search(int i, int l, int r){
    if(l <= T[i].l && T[i].r <= r) return T[i].sum;
    pushdown(i);
    ll tmp = 0;
    int mid = (T[i].r + T[i].l) >> 1;
    if(l <= mid) tmp += search(i*2, l, r);
    if(r > mid) tmp += search(i*2+1, l, r);
    return tmp;
}
int main() {
    int n, m; cin >> n >> m;
    build(1, 1, n);
    for (int i = 0; i < m; ++i) {
        int op; cin >> op;
        if(op == 1){
            int x, y, k; cin >> x >> y >> k;
            add(1, x, y, k);
        }else{
            int x, y; cin >> x >> y;
            cout << search(1, x, y) << "\n";
        }
    }
    return 0;
}
